有限状态机(FSM)写法的总结(一段式,二段式,三段式)

 状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:

     (1)一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;

     (2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;

     (3)三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。

三段式状态机示例模板:

//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器

always @ (posedge clk or negedge rst_n)   //异步复位

if(!rst_n)

         current_state <= IDLE;

else

         current_state <= next_state; //注意,使用的是非阻塞赋值

//第二个进程,组合逻辑always模块,描述状态转移条件判断

always @ (current_state) //电平触发,现存状态为敏感信号

begin

        next_state = x; //要初始化,使得系统复位后能进入正确的状态

case(current_state)

        S1: if(...)

                next_state = S2; //阻塞赋值

        S2: if(...)

                next_state = S3; //阻塞赋值

...

endcase

end

//第三个进程,同步时序always模块,格式化描述次态寄存器输出

always @ (posedge clk or negedge rst_n)

begin

...//初始化

case(next_state)

       S1:

              out1 <= 1'b1; //注意是非阻塞逻辑

        S2:

              out2 <= 1'b1;

         default:... //default的作用是免除综合工具综合出锁存器

endcase

end

  • 15
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的VHDL三段式状态机的示例代码: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity three_stage_fsm is Port ( clk : in STD_LOGIC; reset : in STD_LOGIC; input : in STD_LOGIC; output : out STD_LOGIC); end three_stage_fsm; architecture Behavioral of three_stage_fsm is type state_type is (state1, state2, state3); signal current_state, next_state : state_type; begin process (clk, reset) begin if reset = '1' then current_state <= state1; elsif rising_edge(clk) then current_state <= next_state; end if; end process; process (current_state, input) begin case current_state is when state1 => if input = '1' then next_state <= state2; else next_state <= state1; end if; when state2 => next_state <= state3; when state3 => next_state <= state1; when others => next_state <= state1; end case; end process; process (current_state) begin case current_state is when state1 => output <= '0'; when state2 => output <= '1'; when state3 => output <= '0'; when others => output <= '0'; end case; end process; end Behavioral; ``` 这个状态机有三个状态:state1、state2和state3。输入信号为input,输出信号为output。在state1中,如果输入信号为1,则状态转移到state2;否则状态保持不变。在state2中,状态直接转移到state3。在state3中,状态转移到state1。在其他状态下,状态也转移到state1。这个状态机简单地实现了一个输入信号在连续三个时钟周期内保持高电平状态的功能。 希望这个例子能够帮助您编写VHDL三段式状态机。如果您还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值